package com.pan.alg.niuke.tree;

/**
 * BM29 二叉树中和为某一值的路径(一)
 * 描述
 * 给定一个二叉树root和一个值 sum ，判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
 * 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
 * 2.叶子节点是指没有子节点的节点
 * 3.路径只能从父节点到子节点，不能从子节点到父节点
 * 4.总节点数目为n
 *
 * 例如：
 * 给出如下的二叉树，\ sum=22 sum=22，
 *
 * 返回true，因为存在一条路径 5\to 4\to 11\to 25→4→11→2的节点值之和为 22
 *
 * 数据范围：
 * 1.树上的节点数满足 0 \le n \le 100000≤n≤10000
 * 2.每 个节点的值都满足 |val| \le 1000∣val∣≤1000
 * 要求：空间复杂度 O(n)O(n)，时间复杂度 O(n)O(n)
 * 进阶：空间复杂度 O(树的高度)O(树的高度)，时间复杂度 O(n)O(n)
 */
public class TreeHasPathSum {

    /**
     *
     * @param root TreeNode类
     * @param sum int整型
     * @return bool布尔型
     */
    public boolean hasPathSum (TreeNode root, int sum) {
        if(root==null){
            return false;
        }

        boolean has = deepSee(root,0,sum);

        return has;
    }

    private boolean deepSee(TreeNode root, int val,int sum) {

        if(root.left==null&&root.right==null){
            val+=root.val;
            return val==sum;
        }

        val+=root.val;
        boolean has = false;
        if(root.left!=null){
            has= deepSee(root.left,val,sum);
        }
        if(has){
            return has;
        }
        if(root.right!=null){
            has = deepSee(root.right,val,sum);
        }

        return has;
    }


}
